package com.ymx.darling.bean.entity;

import com.ymx.darling.executor.mapping.relation.RelationFieldInfo;
import com.ymx.darling.bean.entity.listener.SetListener;

import java.util.List;
import java.util.Map;

/**
 * 定义了实体类的基本信息接口，提供了获取实体类相关映射信息的方法
 * @author 爱Java的小于
 */
public interface BeanInfo {
    /**
     * 获取实体类主键字段的信息
     * @return 主键字段信息
     */
    FieldInfo getIdColumnInfo();

    /**
     * 获取用于更新操作的字段信息数组
     * @return 更新操作涉及的字段信息数组
     */
    FieldInfo[] getUpdateColumn();

    /**
     * 获取用于查询操作的字段信息数组
     * @return 查询操作涉及的字段信息数组
     */
    FieldInfo[] getQueryColumn();

    /**
     * 获取逻辑删除字段的信息
     * @return 逻辑删除字段信息
     */
    FieldInfo getLogicDeleteColumn();

    /**
     * 获取实体类对应的数据库表名
     * @return 数据库表名
     */
    String getTableName();

    /**
     * 获取schema名称
     * @return String
     */
    String getSchemaName();

    /**
     * 获取实体类对应的模块类
     * @return 模块类
     */
    Class<?> getModule();

    /**
     * 判断实体类是否对应数据库表
     * @return 是否对应数据库表
     */
    boolean isTableEntity();

    /**
     * 获取实体定义的BeanInfo
     * @return 实体定义的BeanInfo
     */
    BeanInfo getEntityDefBeanInfo();

    /**
     * 获取租户ID字段的信息
     * @return 租户ID字段信息
     */
    FieldInfo getTenantIdColumn();

    /**
     * 获取版本字段的信息
     * @return 版本字段信息
     */
    FieldInfo getVersionColumnInfo();

    /**
     * 获取实体类字段设置监听器列表
     * @return 字段设置监听器列表
     */
    List<SetListener> getOnSetListeners();

    /**
     * 获取实体类简单字段名与FieldInfo的映射
     * @return 简单字段名与FieldInfo的映射
     */
    Map<String, FieldInfo> getSimpleColumnMap();

    /**
     * 获取实体类关联字段信息列表
     * @return 关联字段信息列表
     */
    List<RelationFieldInfo> getRelationFieldInfoList();

    /**
     * 获取字段名与FieldInfo的映射
     * @return 字段名与FieldInfo的映射
     */
    Map<String, FieldInfo> getFieldMap();

    /**
     * 判断实体类是否可填充
     * @return 可填充返回true，否则返回false
     */
    boolean isFillable();

    /**
     * 判断两个BeanInfo中的表名是否相等
     * @param beanInfo 另一个BeanInfo对象
     * @return 表名相等返回true，否则返回false
     */
    default boolean isBeanInfoTableNameEqual(BeanInfo beanInfo) {
        return beanInfo != null && this.getTableName().equals(beanInfo.getTableName());
    }
}
